From 87f0c914aa013d0f9405a467a72d1015da2a0e6e Mon Sep 17 00:00:00 2001 From: Jeffrey Yasskin Date: Mon, 31 Aug 2015 22:05:04 -0700 Subject: [PATCH] Reset `parent`, `cur`, and `dep` when backtracking. --- src/cargo/core/resolver/mod.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index 1c60021af..0fe32de76 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -291,7 +291,7 @@ fn activate_deps_loop(mut cx: Context, remaining_deps.extend(try!(activate(&mut cx, registry, top, &top_method))); loop { // Retrieves the next dependency to try, from `remaining_deps`. - let (parent, cur, dep, candidates, features) = + let (mut parent, mut cur, mut dep, candidates, features) = match remaining_deps.pop() { None => break, Some(mut deps_frame) => { @@ -372,6 +372,7 @@ fn activate_deps_loop(mut cx: Context, let last_err = activation_error(&cx, registry, None, &parent, &dep, &prev_active, &candidates); try!(find_candidate(&mut backtrack_stack, &mut cx, &mut remaining_deps, + &mut parent, &mut cur, &mut dep, registry, last_err)) } }; @@ -398,6 +399,7 @@ fn activate_deps_loop(mut cx: Context, // error. fn find_candidate(backtrack_stack: &mut Vec, cx: &mut Context, remaining_deps: &mut Vec, + parent: &mut Rc, cur: &mut usize, dep: &mut Rc, registry: &mut Registry, mut last_err: Box) -> CargoResult> { while let Some(mut frame) = backtrack_stack.pop() { @@ -411,6 +413,9 @@ fn find_candidate(backtrack_stack: &mut Vec, Some((_, candidate)) => { *cx = frame.context_backup.clone(); *remaining_deps = frame.deps_backup.clone(); + *parent = frame.parent.clone(); + *cur = frame.cur; + *dep = frame.dep.clone(); backtrack_stack.push(frame); return Ok(candidate); } -- 2.30.2